Repository navigation
Bump React Native 0.88 - #101739
Bump React Native 0.88#101739collectioneur wants to merge 43 commits into
Conversation
|
|
…rn-0.88 # Conflicts: # package-lock.json # package.json # patches/@expensify/react-native-live-markdown/details.md # patches/@shopify/react-native-skia/details.md
# Conflicts: # package-lock.json # package.json # patches/react-native/react-native+0.88.0+017+publish-gradle.patch
Codecov Report✅ Changes either increased or maintained existing code coverage, great job!
|
Both releases ship the RN 0.88 / AGP 9 fixes upstream, so the blob-util ProGuard patch and the rnmapbox rn088-compat patch are dropped. The rnmapbox immediate-follow-camera patch is ported to 10.3.10.
…rn-0.88 # Conflicts: # metro.config.js # package-lock.json # package.json # patches/metro/details.md # patches/metro/metro+0.87.1.patch # patches/react-native/details.md # src/components/ValidateCodeInput.tsx
…e-Expensify submodule to main
… Mobile-Expensify
…atusBarAppearance variants
|
All contributors have signed the CLA ✍️ ✅ |
78a3b22 to
49bb2b9
Compare
…rn-0.88 # Conflicts: # ios/Podfile.lock
…r, which React Native 0.87 removed
There was a problem hiding this comment.
NAB / potential follow-up: I wonder if we should consider migrating our gradle scripts from Groovy to Kotlin
There was a problem hiding this comment.
Agreed it'd be nice, it would pair well with moving off the legacy variant API so we can enable android.newDsl. Should I create an issue?
There was a problem hiding this comment.
yep I'd say go for it. We talked about doing it in a follow-up during the last RN upgrade and didn't
| // Required for @shopify/react-native-skia web support | ||
| 'react-native/Libraries/Image/AssetRegistry': false, | ||
| // RN 0.87+ dropped the @react-native/assets-registry package and moved the registry into core | ||
| // (react-native/asset-registry, a Flow file). expo-asset/expo-image import the new path, react-native-svg |
There was a problem hiding this comment.
I think maybe we should fix this with a patch/upstream PR for react-native-svg?
There was a problem hiding this comment.
There's already an upstream PR in the repo, but it isn't merged yet. I'll ask the maintainers when they plan to fix this. I also added a comment with a link to the upstream issue, so we don't forget to remove these lines. So I think it would be better to leave it as is, without a patch, and just bump the library once they ship the release. WDYT?
There was a problem hiding this comment.
Sounds good. Let's open a follow-up issue to upgrade react-native-svg and remove this
| "Function invocation 'currentActivity()' expected". Read `reactApplicationContext.currentActivity` instead. | ||
| ``` | ||
|
|
||
| - Upstream PR/issue: Fixed upstream from 12.0.0 (11.x still has the bare `currentActivity`). Drop this patch when bumping to >= 12.0.0 (11.0.0 stops shipping CommonJS, 12.0.0 moves iOS to Swift 6 concurrency). |
There was a problem hiding this comment.
Is there anything blocking us from upgrading to upgrading to @react-native-documents/picker today?
There was a problem hiding this comment.
Nothing's blocking it, but it's a jump of two major versions. Maybe we could do this bump in a follow-up with proper QA? That way we won't hold up the RN upgrade
There was a problem hiding this comment.
Sorry, 👎🏼
I'm not willing to add a patch just to expedite completion of the React Native upgrade when there's nothing blocking us from just upgrading the other dependency instead.
There was a problem hiding this comment.
Okay, I'll bump it in a separate PR before we land this one
There was a problem hiding this comment.
Where are we till using the base VirtualizedList components from React Native? cc @chrispader can't wait to get rid of the last of these in #98994
There was a problem hiding this comment.
I checked this patch, and it turns out the changes we made aren't needed anymore, since all the places that needed it have been migrated to FlashList. I'll test the patch removal a bit more with the other virtualized lists, but it looks like we can remove it without consequences
| ``` | ||
|
|
||
| - Upstream PR/issue: https://github.com/expo/expo/pull/43864 | ||
| - Upstream PR/issue: https://github.com/expo/expo/pull/43864 (same change, closed without merging). Still unfixed in 58.0.14. |
There was a problem hiding this comment.
Bumped @war-in to reopen that PR. Pretty lame that Expo just closed it "to keep the queue clear" even though they never actioned it at all
There was a problem hiding this comment.
Actually, we don't need that PR anymore 🎉 we switched to Re.Pack so that path is not reachable for us anymore
@MelvinBot prepare an issue for the patch removal
There was a problem hiding this comment.
Created Remove obsolete Expo HMR race-condition patch after Re.Pack migration, including documentation cleanup and verification criteria. No dependency on the upstream Expo PR.
…ndroid.uniquePackageNames litert-support is an empty wrapper that declares the same namespace as litert-support-api, so resolving it directly keeps AGP 9's namespace check on for every other library. Also explain which libraries keep android.builtInKotlin and android.newDsl off.
…to its bump issue
Every list that uses onStartReached is on FlashList now, which doesn't use VirtualizedList.
…rn-0.88 # Conflicts: # ios/Podfile.lock
|
@MelvinBot please create 2 follow-up issues, held on this PR:
|
|
|
…rn-0.88 # Conflicts: # ios/Podfile.lock # package-lock.json
|
Hi! We are aware Melvin tester runs are failing. Please if you could update this branch to latest main and re-run it - this should resolve the issue. If not, reach out to me directly. Thanks for your patience! |
|
@MelvinBot please create 2 follow-up issues, held on this PR: Bump react-native-svg and drop the @react-native/assets-registry workaround |
|
|
|
@MelvinBot please create 2 follow-up issues, held on this PR: Bump react-native-svg and drop the @react-native/assets-registry workaround |
|
|
…rn-0.88 # Conflicts: # Mobile-Expensify # ios/Podfile.lock # package-lock.json # package.json # patches/react-native/details.md # patches/react-native/react-native+0.88.0+001+fixMVCPAndroid.patch # patches/react-native/react-native+0.88.0+021+fix-hermes-sampling-profiler-pthread-kill-crash.patch
|
@shubham1206agra could you please review this PR? |
|
@MelvinBot create 2 follow-up issues as maintainer requests.
|
|
Hi @collectioneur 👋 I see melvin still failing here - I am investigating the issue and the re-run of mine will help me get to the bottom of things. |
|
Thank you! |
|
Created both maintainer-request follow-ups, labeled
|
…rn-0.88 # Conflicts: # Mobile-Expensify # patches/expo/details.md
Explanation of Change
Upgrades React Native 0.86 to 0.88 and Expo SDK 57 to 58 (with React 19.3, Metro 0.87 and Hermes 260318099). Ports our patches to the new versions, drops the ones fixed upstream, adds RN 0.88 build fixes for some native libraries, and adapts StatusBar, the web asset registry, types and Jest to the new APIs.
Non-obvious
package.jsonchanges:@react-native/assets-registryis now a direct dependency. RN 0.87+ moved the registry into core and no longer depends on this package, butreact-native-svgstill imports@react-native/assets-registry/registrywithout declaring it. The App does not import it, so it is in knip'signoreDependencies.react-freezeis now a direct dependency. The App imports it inFreezeWrapperandScreenFreezeWrapperbut only got it transitively throughreact-native-screens, which knip flags.expo-locationpatch (Guard failed lastLocation task in expo-location to stop Android crash on revoked location permission #101091) and itsbuildFromSourceentry are removed.expo-location58 readslastLocationwithaddOnSuccessListener/addOnFailureListenerinstead of readingtask.resultinaddOnCompleteListener, so the crash after revoking the location permission is fixed upstream, and the prebuilt AAR can be used again. Test 6 steps 5-6 cover it.Patches
This PR adds five small compatibility patches instead of bumping those libraries, because no bump removes them safely: two libraries have no release with the fix, and for the other three the fixed version changes much more than the few-line patch it would replace. Each
details.mdrecords the version that lets us drop the patch, and the bumps can follow as separate PRs once RN 0.88 is merged.react-native-draggable-flatlist(new004): RN 0.87 removedInteractionManager, but the library still callsInteractionManager.runAfterInteractions(reset)during render when the list keys change (Columns search, adding or removing waypoints). The render throws, React recovers, andreset()never runs, so the drag state goes stale. The patch usesrequestAnimationFrameinstead, as the upstream fix does. No fixed release: upstream issue #627 and PR #628 are open, and 4.0.3 (May 2025) is still the latest version.react-native-advanced-input-mask(new001): RN 0.87 removed theReact/RCTBaseTextInputView.hheader, which the library imports without using, so the iOS build fails. The patch drops the import. No fixed release: upstream PR #155 is open, and 1.4.6 is still the latest version.react-native-plaid-link-sdk(new002): in RN 0.88getCurrentActivity()is a plain Kotlin function, soPlaidModule.ktdoes not compile. The patch readsreactApplicationContext.currentActivity. Fixed in 12.7.0, bump separately: our OAuth patch001(bank redirects in HybridApp on iOS) does not apply to 12.7.0 or 12.8.8 and has to be re-ported and tested against a real bank, and the bump also moves the native Plaid SDKs (Androidsdk-core5.3.4 to 5.5.x).@ua/react-native-airship(new001): RN 0.88 changed the Kotlin signatures ofViewManagerDelegate, so four overrides fail withACCIDENTAL_OVERRIDE. The patch suppresses that diagnostic. Fixed in 27.0.0, bump separately: 26.12.0 fixes only one of the four overrides, and 27.0.0 is a major that movesAirshipFrameworkProxyfrom CocoaPods to Swift Package Manager on iOS, which needs its own push notification testing.@react-native-documents/picker(new001): samegetCurrentActivity()change as Plaid. Fixed in 12.0.0, bump separately: that is two majors from 10.1.3 (11.0.0 drops CommonJS, 12.0.0 moves iOS to Swift 6 concurrency).Fixed Issues
$ #101427
PROPOSAL: N/A
MOBILE-EXPENSIFY: https://github.com/Expensify/Mobile-Expensify/pull/14136
Tests
Tests are grouped by the platforms they run on, and steps that apply to only some of those platforms are marked. Most of the changes are native (React Native, Expo modules and their patches), so most tests are for the HybridApp on iOS and Android.
All platforms (iOS, Android, mWeb Safari, mWeb Chrome, desktop Chrome/Safari)
Test 1: The composer keeps live markdown and the patched TextInput behavior
*bold* _italic_ ~strike~ `code`, then on a new line> quote https://expensify.com @followed by the first letters of a teammate's name, and pick them from the suggestionscodeas an inline code block with a rounded border and padding around the textTest 2: Receipts can be scanned, rotated and cropped
Test 3: Attachments open, zoom and play
Web only (desktop Chrome/Safari, mWeb Safari, mWeb Chrome)
Test 4: Web resolves images and icons through the new asset registry
Native only (iOS and Android HybridApp)
Test 5: The HybridApp starts and loads on React Native 0.88
npm run iosandnpm run androidTest 6: GPS distance tracking works with Expo 58
Test 7: Native libraries with RN 0.88 build fixes still work
1234.567in the first amount field1234.56(at most two decimals)Android only
Test 8: The chat keeps its scroll position when older messages load
Test 9: The status bar follows the screen
Offline tests
QA Steps
Same as tests, using the staging HybridApp builds and staging web instead of the local
npm runbuilds.PR Author Checklist
### Fixed Issuessection aboveTestssectionOffline stepssectionQA stepssectionAvatar, I verified the components usingAvatarare working as expected)npm run compress-svg)Avataris modified, I verified thatAvataris working as expected in all cases)Designlabel and/or tagged@Expensify/designso the design team can review the changes.mainbranch was merged into this PR after a review, I tested again and verified the outcome was still expected according to theTeststeps.Screenshots/Videos
Android: Native
Test 1:
test1-composer-markdown-paste.mp4
Test 2:
test2a-gallery-scan-orientation-rotate-crop.mp4
Test 3:
test3a-pdf-upload-open-zoom.mp4
test3b-image-zoom-paging-video.mp4
Test 5:
test5-app-start-tabs.mp4
Test 6:
test6a-gps-permission-flow.mp4
test6b-gps-trip-save-offline-map-revoke-permission.mp4
Test 7:
test7-plaid-amount-input.mp4
Test 8:
test8-chat-scroll-older-messages.mp4
Test 9:
test9-status-bar-theme.mp4
Offline:
offline-test-2x.mp4
Android: mWeb Chrome
mweb-chrome-compressed.mp4
iOS: Native
Test 1:ScreenRecording_11-06-2026.11-54-09_1.MP4
ScreenRecording_11-06-2026.11-55-31_1.MP4
Test 2:
ScreenRecording_11-06-2026.12-02-39_1.MP4
Test 3:
ScreenRecording_11-06-2026.12-04-15_1.MP4
Test 5:
ScreenRecording_11-06-2026.12-05-13_1.MP4
Test 6:
ScreenRecording_11-06-2026.12-09-05_1_compressed.mp4
Test 7:
ScreenRecording_11-06-2026.03-13-15_1.MP4
Offline:
iOS: mWeb Safari
safari-mweb-offline-compressed.mp4
safari-mweb-compressed.mp4
MacOS: Chrome / Safari
webrn-compressed.mp4